import axios from 'axios'
import { serverURL, getToken, globalEventBus } from './tools'
import nProgress from 'nprogress'
import 'nprogress/nprogress.css'

// 创建一个自定义的 Axios 实例
const instance = axios.create({
  baseURL: serverURL,
  timeout: 5000
})

// 请求拦截器
instance.interceptors.request.use(
  (config) => {
    // 判断是否有token
    if (getToken()) {
      // 如果有token，将token添加到请求头中
      config.headers.Authorization = getToken()
    }
    // 启动loading
    nProgress.start()
    return config
  },
  (err) => {
    nProgress.done()
    return Promise.reject(err)
  }
)

// 响应拦截器
instance.interceptors.response.use(
  (res) => {
    // 关闭loading
    nProgress.done()
    return res
  },
  (err) => {
    nProgress.done()

    // 错误日志记录（可选）
    console.error('Request failed:', err);
    // 通过全局事件总线发送错误信息
    if (err && err.config) {
      globalEventBus.emit('apiError', {
        error: err,
        requestInfo: {
          url: err.config.url,
          method: err.config.method,
          params: err.config.params,
          data: err.config.data,
          headers: err.config.headers
        },
        responseInfo: err.response ? {
          status: err.response.status,
          statusText: err.response.statusText,
          headers: err.response.headers,
          data: err.response.data
        } : null
      })
    }
    return Promise.reject(err)
  }
)

// 封装请求
export const get = (url, params, config = {}) => {
  // 合并默认配置和传入的配置
  const requestConfig = {
    params,
    ...config // 这里会覆盖默认配置中的同名属性
  }

  // 发送请求并返回数据
  return instance.get(url, requestConfig).then((res) => res.data)
}
export const post = (url, data, config = {}) => {
  // 合并默认配置和传入的配置
  const requestConfig = {
    ...config, // 这里会覆盖默认配置中的同名属性
    data
  }

  // 发送请求并返回数据
  return instance
    .post(url, requestConfig.data, requestConfig)
    .then((res) => res.data)
}

export const put = (url, data, config = {}) => {
  // 合并默认配置和传入的配置
  const requestConfig = {
    ...config, // 这里会覆盖默认配置中的同名属性
    data
  }
  return instance
    .put(url, requestConfig.data, requestConfig)
    .then((res) => res.data)
}

export const del = (url, params, config = {}) => {
  // 合并默认配置和传入的配置
  const requestConfig = {
    params,
    ...config // 这里会覆盖默认配置中的同名属性
  }
  return instance.delete(url, requestConfig).then((res) => res.data)
}